package com.xiaolin.designmode.singleton;

/**
 * @ClassName DoubleCheckSingleton
 * @Description 双重校验
 * @Detail 双检锁，又叫双重校验锁，综合了懒汉式和饿汉式两者的优缺点整合而成。特点是加锁，线程安全，推荐使用
 * @Author MyPC
 * @Date 2020/7/18
 * @Version 1.0
 */
public class DoubleCheckSingleton {
    private static volatile DoubleCheckSingleton doubleCheckSingleton;
    private DoubleCheckSingleton(){}

    /**
     * 双重检查需要使用volatile，防止指令重排序
     *  创建对象的三个步骤：
     *      1、给对象分配内存空间
     *      2、初始化对象
     *      3、将内存地址赋给变量
     *  本来按顺序是先后执行123步骤，如果指令冲排序，那么就可能造成先后执行132步骤，这就导致执行完13步骤时，线程发现对象不为空，直接将未初始化的对象返回
     * @return
     */
    public static DoubleCheckSingleton doubleCheckSingleton(){
        if(doubleCheckSingleton == null){
            synchronized (DoubleCheckSingleton.class){
                if(doubleCheckSingleton == null){
                    doubleCheckSingleton=new DoubleCheckSingleton();
                }
            }
        }
        return doubleCheckSingleton;
    }

}
